#include <vector>
#include <queue>
#include "sched_rr.h"
#include "basesched.h"
#include <stdio.h>

using namespace std;

SchedRR::SchedRR(vector<int> argn) {
	// Round robin recibe el quantum por parámetro
	// Seteo el quantum
	quantum = argn[0];
}

void SchedRR::load(int pid) {
	q.push(pid); // llegó una tarea nueva
}

void SchedRR::unblock(int pid) {
	q.push(pid);
}

int SchedRR::tick(const enum Motivo m) {
	if (m == EXIT) {
		// Si el pid actual terminó, sigue el próximo.
		if (q.empty()){
			return IDLE_TASK;
		} 
		else {
			int sig = q.front(); q.pop();
			quantumUtilizado = 0;
			return sig;
		}
	}
	else if (m == BLOCK)
	{
		// Si se bloquea paso al proximo proceso si hay otro, sino IDLE_TASK
		if (!q.empty()) {
			int sig = q.front(); q.pop();
			//q.push(current_pid());
			quantumUtilizado = 0;
			return sig;
		}
		else
		{
			return IDLE_TASK;
		}	
	} 
	else if (m == TICK)
	{
		// Si estoy en IDLE_TASK...
		if (current_pid() == IDLE_TASK) {
			if (q.empty())
				return IDLE_TASK;
			else {
				quantumUtilizado = 0;
				int sig = q.front(); q.pop();
				return sig;
			}
        } 
		else
		{
			// Sigue el pid actual mientras no termine el quantum.
			// Si se termino el quantum se desaloja y vuelve a la cola
			if(quantumUtilizado >= quantum-1)
			{
				// Si hay otro cambio de proceso y vuelve a la cola
				if (!q.empty()) {
					int sig = q.front(); q.pop();
					q.push(current_pid());
					quantumUtilizado = 0;
					return sig;
				}
				else{
					// Si sigo ejecutando y le doy un quantum nuevo
					quantumUtilizado= 0;
					return current_pid();
				}
			}
			else
			{
				// Si sigo ejecutando aumento el quantumUtilizado
				quantumUtilizado++;
				return current_pid();
			}
		}
	}
	return IDLE_TASK;
}
